package slent.iespana.es.Quimica.CreadorReacciones;

import com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory.Default;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import slent.iespana.es.Quimica.CreadorReacciones.ControladoresEventos.ControladorAgregarQuitarComponentes;
import slent.iespana.es.Quimica.CreadorReacciones.PanelEcuacionQuimica;
import es.iespana.slent.reaccion.*;
import javax.swing.event.ListSelectionListener;

/**
 * Clase utilizada para implementar funcionalidad al panel editor de ecuaciones
 * 
 * @author slent
 */
public class PanelEcuacionQuimicaAlan extends PanelEcuacionQuimica {

    private DefaultListModel modeloReactivos;
    private DefaultListModel modeloProductos;
    private DefaultListModel modeloCompuestos;
    private DefaultListModel modeloElementos;
    ControladorAgregarQuitarComponentes controladorAddQuit;

    public PanelEcuacionQuimicaAlan() {
        super();
        editarPropiedades_tabedPane.setVisible(false);
        asignarModelos();
        asignarEventos();
    }

    /**
     * Se encarga de asignar los modelos correspondientes a cada JList
     */
    private void asignarModelos() {
        modeloReactivos = new DefaultListModel();
        modeloProductos = new DefaultListModel();
        modeloCompuestos = new DefaultListModel();
        modeloElementos = new DefaultListModel();

        reactivosJList.setModel(modeloReactivos);
        productosJList.setModel(modeloProductos);
        compuestosJList.setModel(modeloCompuestos);
        elementosJList.setModel(modeloElementos);
    }

    private void asignarEventos() {
        controladorAddQuit = new ControladorAgregarQuitarComponentes(this);

        agregarReactivo_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                deshabilitarHabBotones(false);
                editarPropiedades_tabedPane.setSelectedComponent(tabReactivos);
                controladorAddQuit.setComponenteAcrear(ControladorAgregarQuitarComponentes.Componente.REACTIVO);
            }
        });

        quitarReactivo_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "quitarReactivo");
            }
        });

        agregarReactivCompuesto_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                deshabilitarHabBotones(false);
                editarPropiedades_tabedPane.setSelectedComponent(tabCompuestos);
                controladorAddQuit.setComponenteAcrear(ControladorAgregarQuitarComponentes.Componente.COMPUESTO);
            }
        });

        quitarCompuesto_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
            }
        });

        agregarElemento_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                deshabilitarHabBotones(false);
                editarPropiedades_tabedPane.setSelectedComponent(tabElementos);
                controladorAddQuit.setComponenteAcrear(ControladorAgregarQuitarComponentes.Componente.ELEMENTO);
            }
        });

        quitarElemento_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "quitar elemento");
            }
        });

        agregarProducto_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                deshabilitarHabBotones(false);
                editarPropiedades_tabedPane.setSelectedComponent(tabReactivos);
                controladorAddQuit.setComponenteAcrear(ControladorAgregarQuitarComponentes.Componente.PRODUCTO);
            }
        });

        quitarProducto_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "quitar producto");
            }
        });
        aceptar_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                deshabilitarHabBotones(true);
                switch (controladorAddQuit.getComponenteAcrear()) {
                    case REACTIVO:
                        Reactivo reac = new Reactivo();
                        reac.setCoeficiente(Integer.parseInt(coeficiente_jTextField.getText()));
                        controladorAddQuit.getReaccion().getEcuacionQuimicaBalanceada().getReactivo().add(reac);
                        modeloReactivos.addElement(reac);
                        break;
                    case PRODUCTO:
                        Producto prod = new Producto();
                        prod.setCoeficiente(Integer.parseInt(coeficiente_jTextField.getText()));
                        controladorAddQuit.getReaccion().getEcuacionQuimicaBalanceada().getProducto().add(prod);
                        modeloProductos.addElement(prod);
                        break;
                    case COMPUESTO:
                        Compuesto comp = new Compuesto();
                        comp.setEstado(estado_jComboBox.getSelectedItem().toString());
                        comp.setNombre(nombre_jTextField.getText());
                        comp.setTipoIonico(tipoIonico_jComboBox.getSelectedItem().toString());
                        if (controladorAddQuit.getReactivoSeleccionado() != null) {
                            controladorAddQuit.getReactivoSeleccionado().getCompuesto().add(comp);
                        }
                        if (controladorAddQuit.getProductoSeleccionado() != null) {
                            controladorAddQuit.getProductoSeleccionado().getCompuesto().add(comp);
                        }
                        modeloCompuestos.addElement(comp);
                        break;
                    case ELEMENTO:
                        Compuesto.Elemento elem = new Compuesto.Elemento();
                        elem.setCantidad(Integer.parseInt(cantidad_jTextField.getText()));
                        elem.setSimbolo(simbolo_jTextField.getText());
                        controladorAddQuit.getCompuestoSeleccionado().getElemento().add(elem);
                        modeloElementos.addElement(elem);
                        break;
                    default:
                        break;
                }
            }
        });
        cancelar_jButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                deshabilitarHabBotones(true);
            }
        });

        reactivosJList.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                controladorAddQuit.quitarTodasSelecciones();
                controladorAddQuit.setReactivoSeleccionado(
                        (Reactivo)modeloReactivos.get(reactivosJList.getSelectedIndex())
                 );
                controladorAddQuit.verCompuestosEnModelo(modeloCompuestos);
            }

        });

        productosJList.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                controladorAddQuit.quitarTodasSelecciones();
                controladorAddQuit.setProductoSeleccionado(
                    (Producto)modeloProductos.get(productosJList.getSelectedIndex())
                );
                controladorAddQuit.verCompuestosEnModelo(modeloCompuestos);
            }
        });

        compuestosJList.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                if(compuestosJList.getSelectedIndex()<0)
                    return;
                controladorAddQuit.setCompuestoSeleccionado(
                    (Compuesto)modeloCompuestos.get(compuestosJList.getSelectedIndex())
                );
                controladorAddQuit.verElementosModelo(modeloElementos);
            }
        });

        elementosJList.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                if(compuestosJList.getSelectedIndex()<0)
                    return;
                controladorAddQuit.setElementoSeleccionado(
                    (Compuesto.Elemento)modeloElementos.get(elementosJList.getSelectedIndex())
                );
            }
        });

    }

    private void deshabilitarHabBotones(boolean deshabilitar) {
        agregarElemento_jButton.setEnabled(deshabilitar);
        agregarProducto_jButton.setEnabled(deshabilitar);
        agregarReactivCompuesto_jButton.setEnabled(deshabilitar);
        agregarReactivo_jButton.setEnabled(deshabilitar);
        quitarCompuesto_jButton.setEnabled(deshabilitar);
        quitarElemento_jButton.setEnabled(deshabilitar);
        quitarProducto_jButton.setEnabled(deshabilitar);
        quitarReactivo_jButton.setEnabled(deshabilitar);

        editarPropiedades_tabedPane.setVisible(!deshabilitar);
    }
}
